Skip to content

Conversation

@DokPlay
Copy link
Owner

@DokPlay DokPlay commented Aug 7, 2025

Sprint 7 – File Manager: автосохранение в CSV + фиксы
Суть
Добавил автосохранение состояния в файл с восстановлением после перезапуска
Раньше данные жили только в памяти и пропадали

Основные изменения
Новый FileBackedTaskManager
Автосохранение в CSV после каждого изменения
Восстановление состояния с сохранением оригинальных ID
Поддержка пустых файлов и всех типов задач

Модель
Сериализация через toCsvRow()
Инкапсуляция subtaskIds в Epic
Валидация epicId в Subtask

Фиксы
Чистка истории при удалении задач
Корректная работа nextId после восстановления
Унифицированный стиль кода

Формат CSV

id,type,name,status,description,epic
3,TASK,Читать ТЗ,IN_PROGRESS,вникнуть,
1,EPIC,Спринт-7,NEW,Файл-менеджер,
2,SUBTASK,save(),NEW,реализовать,1

Как проверить
1 Запустить Main → создастся tasks.csv
2 Перезапустить через loadFromFile() → данные восстановятся
3 Все тесты зеленые (./gradlew test)

Важные моменты
Публичный API не изменился

Нет экранирования спецсимволов в CSV (по ТЗ)

Относительный путь к файлу (можно доработать)

Чек-лист

  • Автосохранение в файле после модификаций
  • Восстановление менеджера из CSV
  • Сохранение исходных id + корректный nextId
  • Тесты на историю и базовые сценарии
  • .gitignore и чистка артефактов

Sergey added 6 commits August 6, 2025 12:48
* src/manager/InMemoryHistoryManager.java
  + Реализован двусвязный список + HashMap<id,Node>
  + add(task) теперь удаляет дубликаты через removeNode за O(1)
  + remove(id) — новый метод HistoryManager

* src/manager/TaskManager.java
  + в интерфейс добавлен void remove(int id)

* src/manager/InMemoryTaskManager.java
  + вызовы historyManager.remove(...) в removeTask / removeEpic / removeSubtask

* src/manager/HistoryManager.java
  + объявлен метод remove(int id)

* tests
  + HistoryManagerTest — проверяет отсутствие дублей и порядок
  + InMemoryTaskManagerTest — проверка очистки истории при удалении,
    истории > 10, дубль-просмотров
  + TaskManagerHistoryIntegrationTest — интеграция: удаление эпика убирает
    эпик и все Subtask'и из истории

Issue: sprint-6 / ТЗ «неограниченная история без дублей»
Copy link

@LexLippi LexLippi left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Привет!

Неплохая работа!

Есть некоторое количество замечаний. которые необходимо исправить!

Желаю удачи!

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Плохо, что эти классы попали в git, локально они уместны, но тут не нужны

}

private void restore() {
if (!file.exists()) return;
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

В соответствии с Google Java Code Style надо добавить скобки:

https://google.github.io/styleguide/javaguide.html#s4.1.1-braces-always-used

Comment on lines 46 to 48
List<Epic> epics = new ArrayList<>();
List<Task> tasks = new ArrayList<>();
List<Subtask> subtasks = new ArrayList<>();
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Такое форматирование выглядит весьма странно :)

r.readLine(); // пропускаем заголовок
String line;
while ((line = r.readLine()) != null) {
if (line.isBlank()) continue;
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Аналогично про скобки

Comment on lines 56 to 61
Task t = fromCsv(line);
switch (t.getType()) {
case EPIC -> epics.add((Epic) t);
case TASK -> tasks.add(t);
case SUBTASK -> subtasks.add((Subtask) t);
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Довольно странным выглядит сначала erasure типа до Task а потом снова кастинг его к конкретному значению, кажется, что этого можно избежать



/*───────────── CSV ─────────────*/
private static String toCsv(Task t) {
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Лучше в каждом типе задачи сделать метод toCsv тогда сможем воспользоваться преимуществами полиморфизма

Comment on lines 68 to 70
for (Epic e : epics) super.addNewEpic(e);
for (Task t : tasks) super.addNewTask(t);
for (Subtask s : subtasks) super.addNewSubtask(s);
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

При использовании этих методов изменятся существующие идентификаторы задач, чего бы не хотелось

import java.nio.file.Files;

/** Менеджер с автосохранением в CSV-файл. */
public class FileBackedTaskManager extends InMemoryTaskManager {
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

В целом советую добавить в Idea сheckstyle-плагин, он помогает избежать ошибок код стайла

Sergey added 15 commits August 9, 2025 00:25
… методах, сохранение исходных id
Copy link

@LexLippi LexLippi left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Привет!

Хорошая работа!

Желаю удачи в следующих спринтах!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants